>>> import re >>> result = re.findall("匹配规则*","这个字符串是否匹配规则则则则则") >>> print(result) ['匹配规则则则则则'] >>> result = re.findall("匹配规则*","这个字符串是否匹配规") >>> print(result) ['匹配规'] >>> result = re.findall("匹配规则*","whether this string is matching?") >>> print(result) []
+元字符
需要字符串里完全符合,匹配规则,就匹配,(规则里的+元字符)前面的一个字符可以是1个或多个原本字符
匹配前一个字符1次或无限次,贪婪匹配前导字符有多少个就匹配多少个很贪婪
1 2 3 4
>>> import re #第一步,要引入re模块 >>> result = re.findall("匹配+", "匹配配配配配规则这个字符串是否匹配规则则则则则") #需要字符串里完全符合,匹配规则,就匹配,(规则里的+元字符)前面的一个字符可以是1个或多个原本字符 >>> print(result) #以列表形式返回匹配到的字符串 ['匹配配配配配', '匹配']
?元字符,和防止贪婪匹配
需要字符串里完全符合,匹配规则,就匹配,(规则里的?元字符)前面的一个字符可以是0个或1个原本字符
匹配一个字符0次或1次
还有一个功能是可以防止贪婪匹配,详情见防贪婪匹配
1 2 3 4
>>> import re #第一步,要引入re模块 >>> result = re.findall("匹配规则?", "匹配规这个字符串是否匹配规则则则则则") #需要字符串里完全符合,匹配规则,就匹配,(规则里的?元字符)前面的一个字符可以是0个或1个原本字符 >>> print(result) #以列表形式返回匹配到的字符串 ['匹配规', '匹配规则']
.*?
1 2 3 4 5 6 7 8 9
>>> line = 'my title="sw engineer". His is "hello world"' >>> m = re.search(r'title="(.*?)"', line) >>> print m.group(1) sw engineer # 如果没有 ?, 则会抓到最长的两个双引号之间的内容 >>> m = re.search(r'title="(.*)"', line) >>> print m.group(1) sw engineer". His is "hello world
>>> import re #第一步,要引入re模块 >>> result = re.findall(r"a\b","welcoma\b") >>> print(result) ['a'] >>> result = re.findall("a\b","welcoma\b") >>> print(result) ['a\x08']
Re
result = re.method(“rule”,string)
1. match()方法, 从字符串头部开始匹配
1 2 3 4 5 6 7 8
import re
content = 'The 123456 is my one phone number.' print(len(content)) #字符串长度 result = re.match(r'^The\s\d+\s\w*', content) #使用match匹配, 第一个参数为正则表达式, 第二个为要匹配的字符串 print(result) print(result.group()) #输出匹配内容 print(result.span()) #输出匹配内容的位置索引
结果:
1 2 3 4
34 <_sre.SRE_Match object; span=(0, 13), match='The 123456 is'> The 123456 is (0, 13)
content = 'The 123456 is my one phone number.' print(len(content)) #字符串长度 result = re.match(r'^The\s(\d+)\sis', content) #使用match匹配, 第一个参数为正则表达式, 第二个为要匹配的字符串 print(result) print(result.group()) #输出匹配内容 print(result.group(1)) #输出第一个被()包裹的内容 print(result.span()) #输出匹配内容的位置索引
结果
1 2 3 4 5
34 <_sre.SRE_Match object; span=(0, 13), match='The 123456 is'> The 123456 is 123456 (0, 13)
3.通用匹配
. 表示匹配任意字符, *表示匹配前面字符无限次.
1 2 3 4 5 6 7
import re
content = 'The 123456 is my one phone number.' result = re.match(r'^The.*number.$', content) #使用match匹配, 第一个参数为正则表达式, 第二个为要匹配的字符串 print(result) print(result.group()) #输出匹配内容 print(result.span()) #输出匹配内容的位置索引
结果
1 2 3
<_sre.SRE_Match object; span=(0, 34), match='The 123456ismy one phone number.'> The 123456ismy one phone number. (0, 34)
4.贪婪与非贪婪
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
import re
content = 'The 123456 is my one phone number.' print('贪婪匹配:') result = re.match(r'^The.*(\d+).*', content) #使用match匹配, 第一个参数为正则表达式, 第二个为要匹配的字符串 print(result.group()) #输出匹配内容 print('result = %s'%result.group(1)) #输出第一个被()包裹的内容 print('-'*20) print('非贪婪匹配:') result = re.match(r'^The.*?(\d+).*', content) print(result.group()) print('result = %s'%result.group(1)) print('-'*20) result = re.match(r'^The.*?(\d+).*?', content) print(result.group())
结果
1 2 3 4 5 6 7 8 9
贪婪匹配: The 123456 is my one phone number. result = 6 -------------------- 非贪婪匹配: The 123456 is my one phone number. result = 123456 -------------------- The 123456
content = '''The 123456 is one of my phone. ''' result = re.match('^The.*?(\d+).*?phone.', content, re.S) if result: print(result.group(1)) else: print('result = None') result2 = re.match('^The.*?(\d+).*?phone.', content) if result2: print(result2.group(1)) else: print('result2 = None')
结果
1 2
123456 result2 = None
6.转义匹配
由于()属于正则表达式的特殊字符, 因此在需要匹配()时, 需要加上转义字符’’.
1 2 3 4 5 6 7 8 9 10 11 12 13
import re
content = '(百度)www.baidu.com' result = re.match('(百度)www.baidu.com', content) result2 = re.match('\(百度\)www\.baidu\.com', content) if result: print(result.group()) else: print('result = None') if result2: print(result2.group()) else: print('result2 = None')
结果
1 2
result = None (百度)www.baidu.com
7.search()方法, 与match()方法不同, 不需要从头部开始匹配
1 2 3 4 5
import re
content = 'Other The 123456 is my one phone number.' result = re.search('The.*?(\d+).*?number.', content) print(result.group())
result = re.findall('<li.*?href="(.*?)".*?singer="(.*?)">(.*?)</a>', html, re.S) if result: print(result) for res in result: print(res[0], res[1], res[2])